package org.totoro.memory.jmm;

/**
 * java内存模型 之 可见性
 *
 * @author daocr
 * @date 2020/2/29
 */

public class JmmVisual {

    //    static volatile boolean stop = false;
    static boolean stop = false;

    /**
     * 可见性测试,主线程已经修改了 stop的值，但是新启动的线程并没有停止工作
     * 原因：
     * <pre>
     *     1、新线程A 把 `stop` 从主内存读取到工作内存
     *     2、main已经修改了变量的值，并且刷入主内存，但是a线程没有再次从主内存中读取数据，导致不能发现数据已经被修改了
     *     3、可以通过 volatile 关键字 来保证每次读取都是从主内存中读取数据，可以解决可见性，但是不能保证原子性
     * </pre>
     */

    public static void main(String[] args) throws InterruptedException {

//        Thread A = new Thread(new Runnable() {
//            @Override
//            public void run() {
//                while (!stop) {
//
//                }
//            }
//        });
//        A.start();
        Object o = new Object();
        synchronized (o) {

            Thread.sleep(Integer.MAX_VALUE);
        }
        stop = true;

//
//        Thread.sleep(1000);

    }


}
